// let ary = [1, 2, 3, 1, 2, 1, 2, 3, 2, 1, 2, 3];

/* 
 * 方案一:
 *  循环原有数组中的每一项, 每拿到一项都往新数组中添加
 *  添加之前验证新数组中是否存在这一项, 不存在增加
*/
// let newAry = [];
/* for(let i = 0; i < ary.length; i++) {
  // 循环获取原有数组中的每一项
  let item = ary[i];
  // 验证新数组中是否存在这一项
  if(newAry.includes(item))  {
    // 存在这一项, 不在增加到新数组中, 继续下一轮循环即可
    continue;
  }
  // 新数组中不存在这一项, 我们加入到新数组中即可
  newAry.push(item);
}
console.log(newAry);
ary.forEach(item => {
  if(newAry.includes(item)) return;
  newAry.push(item);
});
console.log(newAry); */

/* 
 * 方案二
 *  先分别拿出数组中的每一项
 *  用这一项和它后面的每一项一次进行比较
 *  如果遇到和当前项相等的, 则在原来数组中把这一项移除掉
 * 
 * 不用includes / indexOf (这样保证兼容性)
*/


/* for(var i = 0; i < ary.length; i++) {
  var item = ary[i];
  // 让当前项和后面的每一项进行比较(循环)
  for(var j = i + 1; j < ary.length; j++) {
    // compare: 后面要拿出来要比较的每一项
    var compare = ary[j];
    // 如果compare和item相等, 说明这一项是重复的, 我们把它删掉
    if(compare === item) {
      // j索引这一项要从数组中删除
      ary.splice(j, 1);
      // 数组塌陷了: j后面的每一项索引都提前以为, 下一次要比较的应该还是j这个索引的内容
      j--;
    }
  }
}
console.log(ary);
 */

/* for(var i = 0; i < ary.length; i++) {
  var item = ary[i];
  for(var j = i + 1; j < ary.length; j++) {
    var compare = ary[j];
    if(compare === item) {
      ary.splice(j, 1);
      j--;
    }
  }
}
console.log(ary); */

// let ary = [1, 2, 3, 1, 2, 1, 2, 3, 2, 1, 2, 3];
/* let obj = {};
for(let i = 0; i < ary.length; i++) {
  let item = ary[i];
  // 每次存储之前进行判断: 验证obj中是否存在这一项
  if(obj[item] !== undefined) {
    // 已经存在
    ary.splice(i, 1);
    i--;
    continue;
  }
  obj[item] = item;
  
}
console.log(ary);
 */
// 基于splice实现删除性能不好: 当前项被删后, 后面每一项索引都要向前提以为, 如果后面内容过多, 一定影响内容

/* let obj = {};
for(let i = 0; i < ary.length; i++) {
  let item = ary[i];
  // 每次存储之前进行判断: 验证obj中是否存在这一项
  if(obj[item] !== undefined) {
    // 已经存在
    ary[i] = ary[ary.length - 1];
    ary.length--;
    i--;
    continue;
  }
  obj[item] = item;
  
}
console.log(ary); */

// let ary = [1, 2, 3, 1, 2, 1, 2, 3, 2, 1, 2, 3];

/* 
 * unique: 实现数组去重的方法
 * @params
 *    ary[array] 要去重的数组
 * @return
 *    [array] 去重后的数组
 * by chenjing on 20210121
*/
/* function unique(ary) {
  let obj = {};
  for(let i = 0; i < ary.length; i++) {
    let item = ary[i];    
    if(obj[item] !== undefined) {
      ary[i] = ary[ary.length - 1];
      ary.length--;
      i--;
      continue;
    }
    obj[item] = item;
  }
  return ary;
} */

// console.log(unique([12, 23, 12, 34, 23]))

// let ary = [12, 23, 12, 15, 25, 23, 25, 14, 16];
// ary.sort((a, b) => a - b);
// let str = ary.join('@') + '@';
// let reg = /(\d+@)\1*/g;
// let ary1 = [];
// str.replace(reg, (n, m) => {
//   m = Number(m.slice(0, m.length - 1));
//   ary1.push(m);
// });
// console.log(ary1);

// 基于ES6的Set(对应的Map) 实现去重
/* let ary = [12, 23, 12, 15, 25, 23, 25, 14, 16];
ary = [...new Set(ary)];
console.log(ary); */
